import $mbb from '../utils/index.js'
/**
 * 基于 Promise 对象实现更简单的 request 使用方式
 */
export default {
  config: {
    baseUrl: '',
    header: {},
    data: {},
    method: "GET",
    dataType: "json",
    responseType: "text",
    success() {},
    fail() {},
    complete() {}
  },
  interceptor: {
    request: null,
    response: null
  },
  /**
   * 发起网络请求的核心方法
   * 1. 自动拼接 token 与 Content-Type
   * 2. 默认 GET，支持 POST/PUT/DELETE
   * 3. 返回 Promise，外部可 await
   * 4. 依赖全局拦截器对象 this.interceptor
   * 5. 业务状态码 200|20|其它 分别处理
   *
   * 注意：微信会把 header 的 key 强制转小写，后端读取时统一用小写
   */
  request(options) {
    /* ==================== 参数兜底 ==================== */
    console.log("post22222");
    if (!options) {
      options = {}
    }

    /* ==================== 构造公共头 ==================== */
    // 每次请求都重新读取最新 token，防止登录后仍用旧 token
    this.config.header = {
      'Authorization': wx.getStorageSync('USER_INFO') ? wx.getStorageSync('USER_INFO').token : '',
      'Content-Type': 'application/json;charset=utf-8'
    }

    /* ==================== 拼接完整 URL ==================== */
    options.serverUrl = options.serverUrl || '' // 可为空字符串，走相对路径
    options.url = options.serverUrl + options.url // 最终 https://xxx/yyy

    /* ==================== 请求数据兜底 ==================== */
    options.data = options.data || {} // 防止 data 为 undefined
    options.method = options.method || this.config.method // 默认 GET

    /* ==================== Promise 包装 ==================== */
    return new Promise((resolve, reject) => {
      let _config = null // 保存最终配置，供 complete 回调使用

      options.complete = (response) => {
        console.log('statusCode---response-----', response)

        const statusCode = response.statusCode
        response.config = _config // 方便调试时看完整配置

        /* ---------- 响应拦截器（可统一解密、脱敏） ---------- */
        if (this.interceptor.response) {
          const newResponse = this.interceptor.response(response)
          if (newResponse) {
            response = newResponse
          }
        }
        /* ==================== HTTP 状态码 200 系列 ==================== */
        if (statusCode === 200) {
          const {
            code
          } = response.data || {}

          /* -------- 业务成功 -------- */
          if (code === 200) {
            resolve(response.data) // 只把业务数据抛给调用者
          }
          /* -------- 登录态失效 -------- */
          else if (code === 20) {
            // 弹模态框 → 清缓存 → 5 秒后跳首页
            $mbb.wxmethods.model({
              title: '温馨提示',
              content: '登录已过期，需要重新登录！',
              showCancel: 'no', // 注意：这里其实应该传 false，但原代码是字符串
              success: () => {
                wx.removeStorageSync('USER_INFO')
                $mbb.wxmethods.goPage('/home/index/index')
              }
            })
            reject(response) // 继续抛错，阻塞后续业务逻辑
          }
          /* -------- 其它业务错误 -------- */
          else {
            $mbb.prompt.toast(response.data.msg || '服务异常')
            reject(response)
          }
        }
        else {
          $mbb.prompt.toast('请求失败请检查网络')
          reject(response)
        }
      }

      /* ---------- 微信底层请求 ---------- */
      // 注意：wx.request 是异步的，complete 一定会被调用
      wx.request(
        (_config = Object.assign({}, this.config, options)) // 合并默认与用户配置
      )

      /* ---------- 请求拦截器（在发请求前执行） ---------- */
      if (this.interceptor.request) {
        this.interceptor.request(_config) // 调用者可以在这里动态改头、加签等
      }

    })
  },
  get(serverUrl, url, data, options) {
    if (!options) {
      options = {}
    }
    options.serverUrl = serverUrl
    options.url = url
    options.data = data
    options.method = 'GET'
    return this.request(options)
  },
  post(serverUrl, url, data, options) {
    if (!options) {
      options = {}
    }
    options.serverUrl = serverUrl
    options.url = url
    options.data = data
    options.method = 'POST'
    return this.request(options)
  },
  put(serverUrl, url, data, options) {
    if (!options) {
      options = {}
    }
    options.serverUrl = serverUrl
    options.url = url
    options.data = data
    options.method = 'PUT'
    return this.request(options)
  },
  delete(serverUrl, url, data, options) {
    if (!options) {
      options = {}
    }
    options.serverUrl = serverUrl
    options.url = url
    options.data = data
    options.method = 'DELETE'
    return this.request(options)
  }
}